package day9;
//synchronized实现多线程购买商品
//两个线程 都想买100个商品
//商品总数只有100个
//两个线程必须轮流购买
//锁对象.wait() 当线程等待 需要别人唤醒 释放对象锁
//锁对象.notify()随机唤醒一个 锁对象.notifyAll()唤醒全部
public class Demo4 {
    int sum=100;
    public synchronized void buy(){
        //美美分店
        String name=Thread.currentThread().getName();
        if(sum>0){
            sum--;
            System.out.println(name+"购买了商品,剩余:"+sum);
        }
        try {
            this.wait();//等待 释放锁
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.notifyAll();
    }

    public static void main(String[] args) {
        Demo4 d=new Demo4();
        new Thread(()->{
            for(int i=0;i<100;i++){
                d.buy();
            }
        },"美美酱").start();
        new Thread(()->{
            for(int i=0;i<100;i++){
                //晨桑分店
                synchronized (d){
                    String name=Thread.currentThread().getName();
                    if(d.sum>0){
                        d.sum--;
                        System.out.println(name+"购买了商品,剩余:"+d.sum);
                    }
                    try {
                        d.notifyAll();
                        d.wait();
                       //等待 释放锁
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        },"晨桑").start();
    }
}
